 
package cn.ccew.common.utils;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 
 * 
 * 项目名称：mylib
 * 类名称：DateUtil
 * 类描述：日期处理工具类
 * 创建人    张利彬
 * @version 
 *
 */
public class DateUtil {
	private DateUtil(){}
	
	/** 默认的时间日期格式 */
	private static final String DEFAULT_DATE_TIME_FOMRAT = "yyyyMMddhhmmss";
	
	/**
	 * getSystemDateTime(获取系统的时间日期)
	 * @format 默认格式: yyyy-MM-dd hh:mm:ss
	 * @return 按照系统的默认格式返回系统当前日期和时间
	 */
	public static String getSystemDateTime() {
		SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_TIME_FOMRAT);
		return sdf.format(new Date());
	}
	
	/**
	 * getSystemDateTime(根据指定的格式获取系统的时间日期)
	 * @param dateFormat 指定的日期时间格式
	 * @return 按照系统的默认格式返回系统当前日期和时间
	 */
	public static String getSystemDateTime(String dateFormat) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(new Date());
	}
	
	/**
	 * getSystemDateTime(根据指定的格式获取指定日期的字符串)
	 * @param dateFormat 指定的日期时间格式
	 * @param date 日期对象
	 */
	public static String getSystemDateTime(String dateFormat, Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		return sdf.format(date);
	}
	
	/**
	 * parseStringToDate(根据指定的日期字符串返回日期对象)
	 * @param  dateString 要解析的日期字符串
	 * @return 返回这个dateString所代表的日期对象
	 * @throws ParseException 如果转换出现异常, 则返回<code>null</code>对象
	 */
	public static Date parseStringToDate(String dateString) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateString);
		try {
			return sdf.parse(dateString);
		} catch (ParseException e) {
			return null;
		}
	}
	
	
	 public static String parseBrithday2String(Date date){
		 SimpleDateFormat sdf  =   new  SimpleDateFormat( " yyyy-MM-dd" ); 
		 String datestr = sdf.format(date); 
		 return datestr;
	 }
	/**
	 * parseStringToDate(根据一个指定的日期字符串返回一个指定格式的日期对象)
	 * @param  dateStr 指定的日期格式
	 * @param  pattern 指定的字符串格式
	 * @return 返回指定的日期格式
	 * @throws ParseException 如果转换出现异常, 则返回<code>null</code>对象
	 */
	public static Date parseStringToDate(String dateStr, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
			try {
				return sdf.parse(dateStr);
			} catch (ParseException e) {
				return null;
			}
	}
	
	/**
	 * parseSimpleStringToDate(根据一个简单的的日期字符串返回日期对象 例如:yyyy-MM-dd)
	 * @param  simpleDateString 要解析的简单日期字符串
	 * @return 返回这个simpleDateString所代表的日期对象
	 * @throws ParseException 如果转换出现异常, 则返回<code>null</code>对象
	 */
	public static Date parseSimpleStringToDate(String simpleDateString) {
		SimpleDateFormat sdf = new SimpleDateFormat(simpleDateString);
		try {
			return sdf.parse(new StringBuilder(simpleDateString).append(" 00:00:00").toString());
		} catch (ParseException e) {
			return null;
		}
	}
	
	/**
	 * parseDateToString(根据一个简单的的日期字符串返回日期对象 例如:yyyy-MM-dd)
	 * @param  date 指定的日期对象
	 * @param  pattern 要返回的字符串格式
	 * @result 根据指定的pattern格式返回date的指定格式
	 */
	public static String parseDateToString(Date date, String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(date);
	}
	
	/**
	 * parseCurrentDateToLongString(根据当前的日期返回一个Long类型的字符串)
	 * @param  pattern 指定的字符串格式
	 * @result 根据指定的pattern格式返回Long的指定格式
	 */
	public static String parseCurrentDateToLongString(String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(new Date().getTime());
	}
	
	/**
	 * getDateByMonth(返回当天在一月中序号)
	 * @return 返回一个整数
	 */
	public static int getDateByMonth() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		return calendar.get(Calendar.DATE);
	}
    
	/**
	 * getDayByWeek(返回星期几)
	 * @return 返回一个整数
	 */
	public static int getDayByWeek() {
		Calendar cal = Calendar.getInstance();
		cal.setTime(new Date());
		int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (week == 0)
			return 7;
		return week;
	}
	
	/**
	 * 
	 * strToDate(指定的字符串转换为Calendar独享)
	 * @param strDate 指定的日期字符串
	 * @return {@link java.util.Calendar}对象
	 */
	public static Calendar strToDate(String strDate) {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
		ParsePosition pos = new ParsePosition(0);
		Calendar curCalendar = Calendar.getInstance();
		curCalendar.setTime(formatter.parse(strDate, pos));
		return curCalendar;
	}
	
	/**
	 * getCalendarByStrShort(将短日期字符串类型转换为Calendar类型对象)
	 * @param dateStrShort 指定的日期格式的字符串
	 * @return {@link java.util.Calendar}对象
	 */
	public static Calendar getCalendarByStrShort(String dateStrShort) {
		return strToDate(dateStrShort + " 00:00:00.000");
	}

	/**
	 * getDayCount(获取指定日期范围内的天数)
	 * 
	 * @param begDate 开始日期
	 * @param endDate   结束日期
	 * @return 一个整数
	 */
	public static int getDayCount(Date begDate, Date endDate) {
		Calendar startCalendar = getCalendarByStrShort(new SimpleDateFormat("yyyy-MM-dd").format(begDate));
		Calendar endCalendar = getCalendarByStrShort(new SimpleDateFormat("yyyy-MM-dd").format(endDate));
		int dayMCount = 24 * 60 * 60 * 1000;
		return (int) ((endCalendar.getTimeInMillis() - startCalendar.getTimeInMillis())/ dayMCount);
	}
	
	/**
	 * getDayCount(获取指定日期范围内的天数)
	 * 
	 * @param begDate 开始日期字符串
	 * @param endDate 结束日期字符串
	 * @return 一个整数
	 */
	public static int getDayCount(String begDate, String endDate) {
		Calendar startCalendar = getCalendarByStrShort(begDate);
		Calendar endCalendar = getCalendarByStrShort(endDate);
		int dayMCount = 24 * 60 * 60 * 1000;
		return (int) ((endCalendar.getTimeInMillis() - startCalendar.getTimeInMillis())/ dayMCount + 1);
	}
	
	/**
	 * getNextWeek(获得制定时间前或后的week的开始时间和结束时间)
	 * 
	 * @param dateStr
	 * @param count
	 * @return
	 */
	public static String[] getNextWeek(String dateStr, int weekCount) {
		String[] dateRange = { "", "" };
		Calendar curCalendar = getCalendarByStrShort(dateStr);
		curCalendar.setFirstDayOfWeek(Calendar.SUNDAY);
		int dayOfWeek = curCalendar.get(Calendar.DAY_OF_WEEK);
		dayOfWeek = dayOfWeek == 1 ? 7 : dayOfWeek - 1;
		int dayDiff = weekCount <= 0 ? -(dayOfWeek - 1 + 7 * Math
				.abs(weekCount)) : +(1 - dayOfWeek + 7 * weekCount);

		curCalendar.add(Calendar.DATE, dayDiff);
		dateRange[0] = new SimpleDateFormat("yyyy-MM-dd").format(curCalendar.getTime());
		curCalendar.add(Calendar.DATE, 6);
		dateRange[1] = new SimpleDateFormat("yyyy-MM-dd").format(curCalendar.getTime());

		return dateRange;

	}

	/**
	 * getNextMonth(获得指定时间后的指定月份开始和结束时间)
	 * 
	 * @param dateStr
	 * @param monthCount
	 * @return
	 */
	public static String[] getNextMonth(String dateStr, int monthCount) {
		String[] dateRange = { "", "" };
		Calendar curCalendar = getCalendarByStrShort(dateStr);
		curCalendar.add(Calendar.MONTH, monthCount);
		curCalendar.set(Calendar.DAY_OF_MONTH, 1);
		dateRange[0] = new SimpleDateFormat("yyyy-MM-dd").format(curCalendar.getTime());
		curCalendar.set(Calendar.DAY_OF_MONTH, curCalendar
				.getActualMaximum(Calendar.DAY_OF_MONTH));
		dateRange[1] = new SimpleDateFormat("yyyy-MM-dd").format(curCalendar.getTime());
		return dateRange;

	}

	/**
	 * getYear(返回年份)
	 *
	 * @param date 日期
	 * @return 返回年份
	 */
	public static int getYear(java.util.Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.YEAR);
	}

	/**
	 * getMonth(返回月份)
	 *
	 * @param date 日期
	 * @return     返回月份
	 */
	public static int getMonth(java.util.Date date) {
		java.util.Calendar c = java.util.Calendar.getInstance();
		c.setTime(date);
		return c.get(java.util.Calendar.MONTH) + 1;
	}
	

	/**
	 * 获到SQL的当前日期时间
	 * @return
	 */
	public static java.sql.Date getSQLdate() {
		SimpleDateFormat formatter_date = new SimpleDateFormat("yyyy-MM-dd");
		java.util.Date currentTime = new java.util.Date();// 得到当前系统时间
		String str_date1 = formatter_date.format(currentTime).toString(); // 将日期时间格式化
		java.sql.Date curDate = java.sql.Date.valueOf(str_date1);
		return curDate;
	}
	
	/**
	 * 将字符串转日期转成SQL日期
	 * @param str_date 字符串日期
	 * @return
	 */
	public static java.sql.Date getSQLDate(String str_date){
		java.sql.Date curDate = java.sql.Date.valueOf(str_date);
		return curDate;
	}
	
	/**
	 * 获取一天的开始时间以字符串形式返回
	 * Jul 19, 2010 
	 * @return
	 */
	public static String getStringDateStart() {
		return DateUtil.getSystemDateTime("yyyy-MM-dd") + " 00:00:00";
	}
	
	/**
	 * 获取一天的结束时间以字符串形式返回
	 * Jul 19, 2010 
	 * @return
	 */
	public static String getStringDateEnd() {
		return DateUtil.getSystemDateTime("yyyy-MM-dd") + " 23:59:59";
	}
	
	/**
	 * 获取昨天的日期字符串
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static String getYesterdayDate() {
		try {
			Date myDate = new Date(); // 今天的时间
			myDate.setTime(myDate.getTime() - 24 * 60 * 60 * 1000); // 减掉一天后的时间
			return myDate.toLocaleString().substring(0, myDate.toLocaleString().indexOf(" "));
		} catch (Exception e) {
			return null;
		}
	}

	/**
	 * 获取今天的日期字符串
	 * @return
	 */
	@SuppressWarnings("deprecation")
	public static String getTodayDate() {
		try {
			Date myDate = new Date(); // 今天的时间
			return myDate.toLocaleString().substring(0, myDate.toLocaleString().indexOf(" "));
		} catch (Exception e) {
			return null;
		}
	}
}
